经常碰到远程服务器或很多网页上的文件只能看,不能下载的情况,发现有的同事一页一页的截图,而有的文件动不动就几百页,截到吐血。找了一下相关的库,写了一个脚本,可以实现自动翻页,翻页之后自动截图,虽然很粗糙,但工作的很好,给了很多同事使用。
基本的过程就是通过调用Window API 发送鼠标或者键盘消息,控制PDF文件或者网页翻页,然后依次截图保存。这里发送的消息包括鼠标滚轮滚动或者鼠标点击消息,分别用于滚轮翻页和点击特定按钮翻页的情况。为实现鼠标或键盘控制程序的运行,使用了pyHook监听鼠标或键盘消息。
使用的库包括:pywin32、pyhook、PIL。
使用过程为:
代码如下:
1531# -*- coding: utf-8 -*-2import pyHook3import time4import win32api5import win32con6import os7from PIL import ImageGrab8from PIL import ImageChops9import Image10import pythoncom1112getRectStarted =False13captureStarted=False14RightDown=False15MouseMoved=False16mouseClickedTimes=017mouseClickLocation1=(0,0)18mouseClickLocation2=(0,0)19captureStep=120def OnMouseLeftDownEvent(event):21 global mouseClickedTimes,mouseClickLocation1,mouseClickLocation222 if getRectStarted:23 if mouseClickedTimes==0:24 mouseClickedTimes=125 mouseClickLocation1=event.Position26 else:27 mouseClickedTimes=028 mouseClickLocation2=event.Position29 return False30 return True31def OnMouseLeftUpEvent(event):32 pass33 return True34def OnMouseRightDownEvent(event):35 global RightDown36 RightDown=True37 return False38def OnMouseRightUpEvent(event):39 global getRectStarted,mouseClickedTimes,mouseClickLocation1,mouseClickLocation2,RightDown40 getRectStarted=True41 mouseClickedTimes=042 mouseClickLocation1=(0,0)43 mouseClickLocation2=(0,0)44 RightDown=False45 print u'两次单击左键选择矩形截取区域...'46 return False47def OnMouseMiddleDownEvent(event):48 global captureStarted49 hm.UnhookMouse()50 win32api.PostQuitMessage()51 captureStarted=True52 return False53def OnMouseMoveEvent(event):54 global RightDown55 if RightDown:56 hm.UnhookMouse()57 win32api.PostQuitMessage()58 RightDown=False59 return True6061# create the hook mananger62hm = pyHook.HookManager()63# register callbacks64hm.MouseLeftDown = OnMouseLeftDownEvent65hm.MouseRightDown = OnMouseRightDownEvent66hm.MouseRightUp = OnMouseRightUpEvent67hm.MouseMiddleDown = OnMouseMiddleDownEvent68hm.MouseMove = OnMouseMoveEvent6970hm.HookMouse()71##hm.HookKeyboard()72def GetRect():73 global mouseClickLocation2,mouseClickLocation174 if mouseClickLocation1==(0,0) and mouseClickLocation2==(0,0):75 mouseClickLocation2=(500,500)76 left=min(mouseClickLocation1[0],mouseClickLocation2[0])77 right=max(mouseClickLocation1[0],mouseClickLocation2[0])78 up=min(mouseClickLocation1[1],mouseClickLocation2[1])79 down=max(mouseClickLocation1[1],mouseClickLocation2[1])80 return (left,up,right,down)8182def GetPath():83 pathn=os.path.abspath('.')84 i=185 while 1:86 path=pathn+'\\Captures%s\\' %i87 if not os.path.exists(path):88 os.mkdir(path)89 return path90 break91 else:92 i=i+1 9394def CaptureByWheel():95 if not captureStarted:96 return97 bbox=GetRect()98 savedPath=GetPath()99 i=1100 im=ImageGrab.grab(bbox)101 im.save(savedPath+'capture%s.png' %i,'png') 102 while 1:103 i=i+1104 win32api.mouse_event(win32con.MOUSEEVENTF_WHEEL,0,0,-120)105 time.sleep(captureStep)106 im_temp=im107 im=ImageGrab.grab(bbox)108 diff=ImageChops.difference(im_temp,im)109 if diff.getbbox() is None:110 print 'caption done!'111 return112 else:113 im.save(savedPath+'capture%s.png' %i,'png')114115def captureByClick():116 if not captureStarted:117 return118 bbox=GetRect()119 savedPath=GetPath()120 i=1121 im=ImageGrab.grab(bbox)122 im.save(savedPath+'capture%s.png' %i,'png') 123 while 1:124 i=i+1125 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0,0)126 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0,0)127 time.sleep(captureStep)128 im_temp=im129 im=ImageGrab.grab(bbox)130 diff=ImageChops.difference(im_temp,im)131 if diff.getbbox() is None:132 print 'caption done!'133 return134 else:135 im.save(savedPath+'capture%s.png' %i,'png')136137def turnblack(ref):138 if savedPath=='':139 return140 print 'turning...'141 pngs=[os.path.join(savedPath,x) for x in os.listdir(savedPath) if os.path.isfile(os.path.join(savedPath,x)) and os.path.splitext(x)[1]=='.png']142 for png in pngs:143 im=Image.open(png)144 im=im.point(lambda x:255 if x>ref else 0)145 im=im.convert("1")146 im.save(png,'png')147148if __name__ == '__main__':149 print u'单击右键选取截取区域...'150 pythoncom.PumpMessages()151 capture3()152 exit()153## turnblack(200)